// #include<iostream>
// #include<functional>

// // template<class T>
// // void print(T val)
// // {
// //     std::cout<<val<<std::endl;
// // }



// void print(double d=1.11,const char *cc="come",int val=3)
// {
//     std::cout<<d<<std::endl;
//     std::cout<<cc<<std::endl;
//     std::cout<<val<<std::endl;
// }


// int main()
// {
//     int a=3;

//     print();
//     auto p1=std::bind(print);
//     // p1(3.14,"nihao");注意类型匹配
//     p1();
//     return 0;
// }

#include <iostream>  
#include <functional>  
#include<vector>
  
void print(double d = 1.11, const char* cc = "come", int val = 3)  
{  
    std::cout << d << std::endl;  
    std::cout << cc << std::endl;  
    std::cout << val << std::endl;  
}  
  
template<class T>
void prints(T val)  
{  
    std::cout << val << std::endl;  
}  

int Sum(int x,int y)
{
    std::cout<<x<<"+"<<y<<std::endl;
    return x+y;
}

typedef void(*func)();

int main()  
{  
    int a = 3;  
  
    print(); // 使用默认参数  
  
    // // 绑定print，但不传递任何参数，因此调用p1()时会使用默认参数  
    // auto p1 = std::bind(print);  
    // p1(); // 输出默认参数  
    auto p1 = []() { print(); }; // 使用 lambda 表达式来包装 print 调用  
    p1(); // 应该输出默认参数  
  
    // 如果你想要能够传递参数给print，可以这样做：  
    auto p2 = std::bind(print, 3.14, std::placeholders::_2, std::placeholders::_3);  
    p2("nihao", 42); // 输出 3.14, nihao, 42  
  

    //应用任务队列
    std::vector<std::function<void()>> funcs;
    funcs.push_back(std::bind(prints<int>,42));
    funcs.push_back(std::bind(prints<double>,3.14));
    // funcs.push_back(std::bind<const char*>(prints<const char*>,"How"));
    funcs.push_back(std::bind(prints<const char*>,"How"));
    funcs.push_back(std::bind(Sum,10,20));

    for(auto& func:funcs){
        func();
    }

    return 0;  
}